package cn.edu.zzuli.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.awt.image.Kernel;

//标注这个类是一个切面
@Aspect
@Component
public class AnnoPointCut {

    private final String pointcut = "execution(* cn.edu.zzuli.service.UserServiceImpl.*(..))";

    //可以使用变量的方式
    @Before(pointcut)
    public void before() {
        System.out.println("方法执行前----->");
    }

    //同样可以直接写切入点
    @After("execution(* cn.edu.zzuli.service.UserServiceImpl.*(..))")
    public void after() {
        System.out.println("<-----方法执行后");
    }

    @AfterReturning(pointcut)
    public void afterReturning() {
        System.out.println("<-----返回参数后----->");
    }

    //在环绕时，我们可以给定一个参数
    //ProceedingJoinPoint 代表我们要获取的切入点
    @Around(pointcut)
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("环绕前");
        //获取签名（哪个方法被执行了）
        //void cn.edu.zzuli.service.UserService.add()
        Signature signature = joinPoint.getSignature();
        System.out.println(signature);
        //执行方法，你可以将它想象成一个过滤器
        Object proceed = joinPoint.proceed();
        System.out.println(proceed);

        System.out.println("环绕后");

    }
}
